﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Fintech.Utils;
using Microsoft.Data.Extensions;

namespace ZOVNP.Engine
{
    /// <summary> Материализатор для заданного типа объекта. </summary>
    internal class MaterializerEntry
    {

        #region Поля

        private Type entityType;
        private IMaterializer materializer;

        #endregion

        #region Конструкторы

        /// <summary> Создать материализатор. </summary>
        /// <param name="EntityType"> Тип материализуемого объекта. </param>
        /// <remarks> Будет создан материализатор по умолчанию. </remarks>
        private MaterializerEntry(Type EntityType)
        {
            EntityType.CheckOnNull("EntityType");
            entityType = EntityType;
        }

        /// <summary> Создать материализатор. </summary>
        /// <param name="EntityType"> Тип материализуемого объекта. </param>
        /// <param name="Materializer"> Используемый материализатор. </param>
        public MaterializerEntry(Type EntityType, IMaterializer Materializer)
            : this(EntityType)
        {
            Materializer.CheckOnNull("Materializer");
            materializer = Materializer;
        }

        #endregion

        #region Свойства

        /// <summary> Тип материализуемого объекта. </summary>
        public Type EntityType { get { return entityType; } }

        /// <summary> Используемый материализатор. </summary>
        /// <remarks> null, если необходимо использовать стандартный материализатор. </remarks>
        public IMaterializer Materializer { get { return materializer; } }

        /// <summary> Признак того, что должен использоваться стандартный материализатор. </summary>
        public bool IsDefault { get { return materializer == null; } }

        #endregion

        #region Методы

        /// <summary> Создание стандартного материализатора. </summary>
        /// <typeparam name="T"> Тип материализуемого объекта. </typeparam>
        /// <returns> Материализатор для заданного типа объекта. </returns>
        public static MaterializerEntry Default<T>() { return new MaterializerEntry(typeof(T)); }

        /// <summary> Создание стандартного материализатора. </summary>
        /// <param name="EntityType"> Тип материализуемого объекта. </param>
        /// <returns> Материализатор для заданного типа объекта. </returns>
        public static MaterializerEntry Default(Type EntityType) { return new MaterializerEntry(EntityType); }

        /// <summary> Создание материализатора для заданного типа. </summary>
        /// <typeparam name="T"> Тип материализуемого объекта. </typeparam>
        /// <param name="Materializer"> Используемый материализатор. </param>
        /// <returns> Материализатор для заданного типа объекта. </returns>
        public static MaterializerEntry Create<T>(IMaterializer Materializer) { return new MaterializerEntry(typeof(T), Materializer); }

        /// <summary> Преобразовать к строке. </summary>
        /// <returns> Строковое представление объекта. </returns>
        public override string ToString()
        {
            return string.Format("Материализатор {0} для типа {1}.", IsDefault ? "(стандартный)" : Materializer.GetType().Name, EntityType.Name);
        }

        #endregion

    }
}
